/***
 * 
 *              Hi3861 gpio输出pwm（gpio复用功能）
 * 通道：pwm0 -pwm1 -pwm2 -pwm3 -pwm4 -pwm5
 * 一共6个pwm通道，这里测试第一通道（pwm0）的输出，
 * 查阅《Hi3861V100／Hi3861LV100／Hi3881V100 WiFi芯片 用户指南》表6.3-Hi3861引脚复用功能表可知
 * pwm0可在GPIO7、GPIO9两个引脚配置。这里选GPIO9，因为载板led接了GPIO9，方便测试
 * 实现功能：
 *      控制外接led亮度呼吸效果、蜂鸣器频率
 *      
 * 2021.08.29 By HelloKun  
 *  
 * 
 * 
 */ 

#include <stdio.h>
#include <unistd.h>
#include "ohos_init.h"
#include "cmsis_os2.h"

#include "iot_gpio.h"
#include "hi_io.h"
#include "iot_pwm.h"
#include "hi_time.h"

#define PWM_TASK_STACK_SIZE 512
#define PWM_TASK_PRIO 25
#define PWM0_TEST_GPIO 9
#define PWM0 0  //== hi_pwm.h 中定义了枚举类型 HI_PWM_PORT_PWM0 0

static void PwmdemoTask(void *arg)
{
    (void) arg;
    int val=1;
    while(1)
    {

         for (val=99;val>1;val-=5)
        {
            IoTPwmStart(PWM0,val,3200000);
            osDelay(10);
            //hi_udelay(2000);
            //IoTPwmStop(PWM0);
        }
        osDelay(10);
        for (val=1;val<99;val+=5)
        {
            IoTPwmStart(PWM0,val,3200000);
            //osDelay(1);
           // hi_udelay(2000); //us
             osDelay(10);
            //IoTPwmStop(PWM0);
        }

        /*IoTPwmStart(PWM0,50,3200000);
        osDelay(100);
        IoTPwmStop(PWM0);
        osDelay(100);
        
        IoTPwmStart(PWM0,70,3200000);
        osDelay(100);
        IoTPwmStop(PWM0);
        osDelay(100);
        IoTPwmStart(PWM0,90,3200000);
        osDelay(100);
        IoTPwmStop(PWM0);
        osDelay(100);*/
         
       
        
    }
}

static void PwmdemoEntry(void)
{
    osThreadAttr_t attr;
    
    IoTGpioInit(PWM0_TEST_GPIO); 
    hi_io_set_func(PWM0_TEST_GPIO,HI_IO_FUNC_GPIO_9_PWM0_OUT); //==初始化 GPIO9 的pwm复用功能

    IoTPwmInit(PWM0); //==初始化pwm0
    
    IoTPwmStart(PWM0,50,80000); //==配置pwm0输出参数：占空比50%、频率160M/80000=2KHz 
    //== 参数：pwm_port：0-5 duty：1-99  frep：> 160M/65535 = 2441

    //osDelay(100);   //==单位 ms
    //usleep(100000); //==led_example中使用过，单位1/1000 us

   // IoTPwmStop(PWM0);
    

    attr.name = "PwmdemoTask";              //==指定线程运行的任务
    attr.attr_bits = 0U;                    //==
    attr.cb_mem = NULL;                     //==
    attr.cb_size = 0U;                      //==
    attr.stack_mem = NULL;                  //==
    attr.stack_size = PWM_TASK_STACK_SIZE;  //==
    attr.priority = PWM_TASK_PRIO;          //==优先权限 

    if(osThreadNew(PwmdemoTask,NULL,&attr)==NULL){
        printf("[PwmdemoEntry] creat PwmdemoTask failed!\n");
    }
}

SYS_RUN(PwmdemoEntry);

 /**关于IoTPwmStart(port,duty,frep)说明如下：
     * 参数：pwm_port：0-5 duty：1-99  frep：> 160M/65535 = 2441
     * 实际输出频率 hiFrep=160M/freq
     * 实际
     * hi_pwm.h中的参考源码如下：
     * hiFreq = (unsigned short)(CLK_160M / freq);
       hiDuty = (duty * hiFreq) / DUTY_MAX;
       (CLK_160M / freq) < 0xFFFF(65535)  return Failed; //也就是说实际频率不大于65.535KHz 
       return hi_pwm_start((hi_pwm_port)port, hiDuty, hiFreq);

       另外，160M时钟频率是内部时钟源，IoTPwmStar()函数默认使用了内部时钟；
       使用外部晶振为时钟源时，取决主控芯片外部使用的晶振频率，3861套件上是40MHz；
       Harmony2.0中提供了PwmSetClock接口，用户可选择时钟源，详见（hi_pwm.h）：
          hi_u32 hi_pwm_set_clock(hi_pwm_clk_source clk_type); //==设置时钟源

     **/